//package com.ifp.opengate.boot.bean.access;
//
//import java.util.HashMap;
//import java.util.Map;
//
//import javax.annotation.PostConstruct;
//
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import com.ifp.core.exception.BaseException;
//import com.ifp.core.util.StringUtil;
//import com.ifp.opengate.boot.bean.config.AppSecretConfigBean;
//import com.ifp.opengate.boot.constants.Constants;
//
///***密钥安全实时数据控制*
//
//@author
//灭霸 2018-11-12**/@Component
//public class AppSecretAccessBean {
//    // @Autowired
//    // @Qualifier("cacheHandler")
//    // private CacheHandler cacheHandler;
//    /** 所有应用密钥配置 */
//    private Map<String, AppSecretConfigBean> configMap = new HashMap<String, AppSecretConfigBean>();
//
//    /**
//     * 系统api（无产品属性），多个使用|分割
//     */
//    @Value("${open.gate.sys.api}")
//    private String sysApi;
//
//    /**
//     * 密钥刷新接口
//     */
//    @Value("${open.gate.reflash}")
//    private String reflashKey;
//
//    public String getSysApi() {
//        return sysApi;
//    }
//
//    public void setSysApi(String sysApi) {
//        this.sysApi = sysApi;
//    }
//
//    public String getReflashKey() {
//        return reflashKey;
//    }
//
//    public void setReflashKey(String reflashKey) {
//        this.reflashKey = reflashKey;
//    }
//
//    // 初始化
// @SuppressWarnings("unchecked")
// @PostConstruct
// public void init() throws BaseException{
// System.out.println("=============appSecretAccessBean=============");
// // 获取缓存中所有密钥
//// List<String> appSerectKeys = (List<String>) cacheHandler.getKeys(Constants.OPEN_GATE_CACHE_NAME,
// Constants.APP_SECRET_ALL);
//// if (null != appSerectKeys && !appSerectKeys.isEmpty()) {
//// for (String key : appSerectKeys) {
//// Map<String, String> appSecretInfo = null;
//// try {
//// appSecretInfo = (Map<String, String>)
// cacheHandler.get(Constants.OPEN_GATE_CACHE_NAME,key.substring(key.indexOf("_") + 1), Constants.CACHE_VALUE_TYPE_MAP);
//// long invalidTime = Long.parseLong(appSecretInfo.get("invalidTime"));
//// String appId = appSecretInfo.get("appId");
//// String appSecretAkey = appSecretInfo.get("appSecretAkey");
//// String appSecretBkey = appSecretInfo.get("appSecretBkey");
//// String appSecretAkeyStatus = appSecretInfo.get("appSecretAkeyStatus");
//// String appSecretBkeyStatus = appSecretInfo.get("appSecretBkeyStatus");
//// AppSecretConfigBean appSecretConfigBean = new AppSecretConfigBean(appId, invalidTime, appSecretAkey, appSecretBkey,
// appSecretAkeyStatus, appSecretBkeyStatus);
//// this.configMap.put(appId, appSecretConfigBean);
//// Trace.logInfo(Trace.MODULE_CORE, "启动初始化应用[{}]密钥成功", appId);
//// } catch (Exception e) {
//// Trace.logError(Trace.MODULE_CORE, "启动初始化应用密钥[{}]异常", appSecretInfo);
//// }
//// }
//// }
// }
//
//    /**
//     * 密钥插入
//     *
//     * @param appId
//     * @param appSecret
//     */
//    public void insert(String appId, String appSecret) {
//
//    }
//
//    /**
//     * 密钥更新
//     *
//     * @param appId
//     * @param appSecret
//     */
//    public void update(String appId, String appSecret) throws BaseException {
//        AppSecretConfigBean appSecretConfigBean = this.configMap.get(appId);
//        // 是否存在
//        if (null == appSecretConfigBean) {
//            long invalidTime = System.currentTimeMillis();
//            String appSecretAkey = null;
//            String appSecretBkey = appSecret;
//            // A钥为禁用状态
//            String appSecretAkeyStatus = "2";
//            // B钥为已使用状态
//            String appSecretBkeyStatus = "1";
//            appSecretConfigBean = new AppSecretConfigBean(appId, invalidTime, appSecretAkey, appSecretBkey,
//                appSecretAkeyStatus, appSecretBkeyStatus);
//            this.configMap.put(appId, appSecretConfigBean);
//            // 缓存插入
//            Map<String, String> appSecretInfo = new HashMap<String, String>();
//            appSecretInfo.put(appId, appId);
//            appSecretInfo.put("invalidTime", invalidTime + "");
//            appSecretInfo.put("appSecretAkey", appSecretAkey);
//            appSecretInfo.put("appSecretBkey", appSecretBkey);
//            appSecretInfo.put("appSecretAkeyStatus", appSecretAkeyStatus);
//            appSecretInfo.put("appSecretBkeyStatus", appSecretBkeyStatus);
//            String cacheKey = Constants.APP_SECRET_PREFIX + appId;
//            // cacheHandler.put(Constants.OPEN_GATE_CACHE_NAME, cacheKey, appSecretInfo);
//            return;
//        } else {
//            // 更新
//            // 密钥失效时间
//            long invalidTime = System.currentTimeMillis();
//            // A钥设置成B钥
//            String appSecretAkey = appSecretConfigBean.getAppSecretBkey();
//            // 更新B钥
//            String appSecretBkey = appSecret;
//            // 更新A钥状态为已使用
//            String appSecretAkeyStatus = "1";
//            // 更新B钥状态为未使用
//            String appSecretBkeyStatus = "0";
//
//            // bean更新
//            appSecretConfigBean.setAppSecretAkey(appSecretAkey);
//            appSecretConfigBean.setAppSecretAkeyStatus(appSecretAkeyStatus);
//            appSecretConfigBean.setAppSecretBkey(appSecretBkey);
//            appSecretConfigBean.setAppSecretBkeyStatus(appSecretBkeyStatus);
//            appSecretConfigBean.setInvalidTime(invalidTime);
//            this.configMap.put(appId, appSecretConfigBean);
//
//            // 缓存更新
//            Map<String, String> appSecretInfo = new HashMap<String, String>();
//            appSecretInfo.put(appId, appId);
//            appSecretInfo.put("invalidTime", invalidTime + "");
//            appSecretInfo.put("appSecretAkey", appSecretAkey);
//            appSecretInfo.put("appSecretBkey", appSecretBkey);
//            appSecretInfo.put("appSecretAkeyStatus", appSecretAkeyStatus);
//            appSecretInfo.put("appSecretBkeyStatus", appSecretBkeyStatus);
//            String cacheKey = Constants.APP_SECRET_PREFIX + appId;
//            // cacheHandler.put(Constants.OPEN_GATE_CACHE_NAME, cacheKey, appSecretInfo);
//        }
//    }
//
//    /**
//     * 密钥获取
//     *
//     * @param appId 应用编号
//     * @param isRetry 是否重试
//     * @param isInvalidTime 是否校验过期时间
//     */
//    public String getAppSecretKey(String appId, boolean isRetry, boolean isInvalidTime) {
//        AppSecretConfigBean appSecretConfigBean = this.configMap.get(appId);
//        String bkeyStatus = appSecretConfigBean.getAppSecretBkeyStatus();
//        long invalidTime = appSecretConfigBean.getInvalidTime();
//
//        // 如果没有缓冲信息直接返回 null
//        if (!StringUtil.hasText(bkeyStatus)) {
//            return null;
//        }
//
//        // 如果不需要校验秘钥失效时间,直接返回Bkey,商户既然已经申请了秘钥就会使用最新秘钥
//        if (!isInvalidTime) {
//            return appSecretConfigBean.getAppSecretBkey();
//        }
//
//        String appSecretKey = null;
//        // 如果是已使用过Bkey
//        if ("1".equals(bkeyStatus)) {
//            // 24小时有效期，只有重新申请了秘钥才有30分钟的缓冲时间窗口
//            if (System.currentTimeMillis() - invalidTime < 1000 * 60 * 60 * 24) {
//                appSecretKey = appSecretConfigBean.getAppSecretBkey();
//            }
//            // 如果未使用过Bkey
//        } else if ("0".equals(bkeyStatus) || "3".equals(bkeyStatus)) {
//            // 首次请求，直接返回Bkey
//            if (!isRetry) {
//                appSecretKey = appSecretConfigBean.getAppSecretBkey();
//                // 更新Bkey已使用
//                appSecretConfigBean.setAppSecretBkeyStatus("3");// 3表示系统尝试状态
//                // 更新Akey已失效
//                appSecretConfigBean.setAppSecretAkeyStatus("2");
//                this.configMap.put(appId, appSecretConfigBean);
//            } else {
//                // Bkey加密失败时重试获取Akey
//                // 30分钟缓冲时间窗，30分钟内旧密钥可用，只有重新申请了秘钥才有30分钟的缓冲时间窗口
//                if (System.currentTimeMillis() - invalidTime < 1000 * 60 * 30) {
//                    appSecretKey = appSecretConfigBean.getAppSecretAkey();
//                    // 更新Bkey未使用
//                    appSecretConfigBean.setAppSecretBkeyStatus("0");
//                    // 更新Akey已使用
//                    appSecretConfigBean.setAppSecretAkeyStatus("1");
//                    this.configMap.put(appId, appSecretConfigBean);
//                }
//            }
//        }
//        return appSecretKey;
//    }
//
//}
